package com.robertux.leaderboard.util.gestoresModelos;

import java.util.List;

import javax.persistence.NoResultException;
import javax.persistence.TypedQuery;

import org.apache.log4j.Logger;

import com.robertux.leaderboard.beans.entities.BonosMeta;

public class GestorBonosMetas {
	private GestorEntidades<BonosMeta> gestorBonos;
	private Logger logger;
	
	public GestorBonosMetas() {
		this.gestorBonos = new GestorEntidades<BonosMeta>();
		this.logger = Logger.getLogger(this.getClass());
	}
	
	public GestorBonosMetas(GestorEntidades<BonosMeta> gestor) {
		this.gestorBonos = gestor;
		this.logger = Logger.getLogger(this.getClass());
	}
	
	public List<BonosMeta> getBonos() {
		TypedQuery<BonosMeta> qry = this.gestorBonos.getEntityManager().createQuery("SELECT bono FROM BonosMeta bono ORDER BY bono.id", BonosMeta.class);
		
		try {
			return qry.getResultList();
		} catch (Exception e) {
			this.logger.error("Error tratando de consultar los bonos por cantidad de metas: " + e.getMessage(), e);
			return null;
		}
	}
	
	public BonosMeta getBono(int id) {
		return this.gestorBonos.getEntidad("BonosMeta", BonosMeta.class, id);
	}
	
	public BonosMeta getBonoPorMetas(int cantidadMetas) {
		TypedQuery<BonosMeta> qry = this.gestorBonos.getEntityManager().createQuery("SELECT bono FROM BonosMeta bono WHERE bono.cantidadMetas = :cant", BonosMeta.class);
		qry.setParameter("cant", cantidadMetas);
		
		try {
			return qry.getSingleResult();
		} catch (NoResultException nrE) {
			return null;
		} catch (Exception e) {
			this.logger.error("Error tratando de consultar los bonos por cantidad de metas: " + e.getMessage(), e);
			return null;
		}
	}
	
	public BonosMeta getMaxBonoPorMetas() {
		TypedQuery<BonosMeta> qry = this.gestorBonos.getEntityManager().createQuery("SELECT bono FROM BonosMeta bono WHERE bono.cantidadMetas = (SELECT MAX(bono.cantidadMetas) FROM BonosMeta bono)", BonosMeta.class);
		
		try {
			return qry.getSingleResult();
		} catch (NoResultException nrE) {
			return null;
		} catch (Exception e) {
			this.logger.error("Error tratando de consultar el maximo bono por cantidad de metas: " + e.getMessage(), e);
			return null;
		}
	}
	
	public boolean agregarBono(BonosMeta asist) {
		try {
			this.gestorBonos.persistir(asist);
			return true;
		} catch (Exception e) {
			this.logger.error("Error tratando de persistir la cantidad de bonos por meta: " + e.getMessage(), e);
			return false;
		}
	}
	
	public boolean actualizarBono(BonosMeta bono) {
		try {
			this.gestorBonos.actualizar(bono);
			return true;
		} catch (Exception e) {
			this.logger.error("Error tratando de actualizar la cantidad de bonos por meta: " + e.getMessage(), e);
			return false;
		}
	}
	
	public boolean delBono(BonosMeta bono) {
		try {
			this.gestorBonos.eliminar(bono);
			return true;
		} catch (Exception e) {
			this.logger.error("Error tratando de eliminar la cantidad de bonos por meta: " + e.getMessage(), e);
			return false;
		}
	}
}
